package com.kinyx.framework.bean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.kinyx.framework.annotation.assist.CanNotNull;
import com.kinyx.framework.annotation.assist.CanNull;
import com.kinyx.framework.utils.KListUtils;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

/**
 * GET请求参数
 */
@Getter
@RequiredArgsConstructor
public class GetArgs {

	/** 地址 */
	@CanNotNull
	private final String url;
	/** 字符集 */
	@CanNull(defaultValue = "Configs.default_KReader_charset")
	private final String charset;
	/** 参数 */
	@CanNull
	private Map<String, String> params;
	/** 头信息 */
	@CanNull
	private Map<String, String> headers;
	/** 代理 */
	@CanNull
	private String userAgent;

	/**
	 * 取带参数的地址
	 * @return 带参数的地址
	 */
	public String getUrlWithParams() {
		final StringBuilder requestUrl = new StringBuilder(this.url);
		if (this.params != null) {
			requestUrl.append("?");
			final List<String> list = new ArrayList<>();
			this.params.forEach((key, value) -> { list.add(String.format("%s=%s", key, value)); });
			requestUrl.append(KListUtils.join(list, "&", null));
		}
		return requestUrl.toString();
	}

	/**
	 * 追加请求参数
	 * @param key 参数键 
	 * @param value 参数值
	 * @return 本对象
	 */
	public GetArgs param(@CanNotNull final String key, @CanNull final String value) {
		if (this.params == null) { this.params = new HashMap<>(); }
		this.params.put(key, value);
		return this;
	}

	/**
	 * 追加请求头信息
	 * @param key 参数键 
	 * @param value 参数值
	 * @return 本对象
	 */
	public GetArgs header(@CanNotNull final String key, @CanNull final String value) {
		if (this.headers == null) { this.headers = new HashMap<>(); }
		this.headers.put(key, value);
		return this;
	}

	/**
	 * 设置代理
	 * @param userAgent 代理
	 * @return 本对象
	 */
	public GetArgs userAgent(@CanNull final String userAgent) {
		this.userAgent = userAgent;
		return this;
	}

}
